package rkdwogus7.swing;

import java.awt.BorderLayout;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;

import java.awt.Dimension;
import java.util.ArrayList;

import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ScrollPaneConstants;

import rkdwogus7.dao.MemberDAO;
import rkdwogus7.model.MemberVO;
import rkdwogus7.swing.AddMember;
import rkdwogus7.swing.UpdateMember;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class ManageMember extends JDialog {

	private final JPanel contentPanel = new JPanel();
	private JTable table;
	private MemberDAO mdao = new MemberDAO();
	private DefaultTableModel model;
	private MemberVO m;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		try {
			ManageMember dialog = new ManageMember();
			dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
			dialog.setVisible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Create the dialog.
	 */
	public ManageMember() {
		setTitle(":: 회원 매니저 ::");
		setBounds(100, 100, 640, 480);
		getContentPane().setLayout(new BorderLayout());
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		getContentPane().add(contentPanel, BorderLayout.CENTER);
		contentPanel.setLayout(new BorderLayout(0, 0));
		{
			JPanel listPane = new JPanel();
			listPane.setPreferredSize(new Dimension(640, 360));
			contentPanel.add(listPane, BorderLayout.NORTH);
			{
				JScrollPane scrollPane = new JScrollPane();
				scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
				scrollPane.setPreferredSize(new Dimension(600, 330));
				listPane.add(scrollPane);
				{
					// JTable에 출력할 데이터를 ArrayList로 작성
					ArrayList<MemberVO> list = mdao.selectMember();
					// 각 행들의 정보를 DAO에서 받아 와서 VO에 저장한 것
					// DAO에 가 봐.
					
					// JTable에 데이터를 표시하기 위해 defaultTableModel 객체 생성
					// DefaultTableModel model = new DefaultTableModel();
					model = new DefaultTableModel();
					// 더블클릭 시 열 수정이 되지 못하게 재설정
					model = new DefaultTableModel() {
						@Override
						public boolean isCellEditable(int row, int column) {
							// 어제 했던 대로 배열로 쓰면 특정 열만 수정 안되게 해 줄 수 있는 거야.
							return false;
						}
					};
					
					// JTable의 제목 행 설정
					model.setColumnIdentifiers(
							new String[] { "회원번호", "아이디", "이름", "등록일" });
					
					// JTable의 본문 행 설정
					// arraylist에 있는 갯수 만큼 돌려야 하겠지
					for (MemberVO m : list) {
						model.addRow(
								new String[]
										{ m.getMno(), m.getUserid(), m.getName(), m.getRegdate() });
						// DefaultTableModel 객체에 addRow method를 이용해서
						// JTable에 출력할 데이터를 추가함
					}
					
					table = new JTable();
					table.addMouseListener(new MouseAdapter() {
						@Override
						public void mouseClicked(MouseEvent e) {
							// 더블클릭 이벤트 발생시키는거. 며칠 전에 해 봤잖아.
							JTable t = (JTable) e.getSource();
							if (e.getClickCount() == 2) {
								// 회원 상세정보 출력
								
							}
						}
					});
					// 창을 따로 띄워서 해야 돼
					
					// DefaultTableModel 객체를 JTable에 적용
					table.setModel(model);
					
					table.setPreferredSize(new Dimension(600, 340));
					scrollPane.setViewportView(table);
					
					
					
				}
			}
		}
		{
			JPanel buttonPane = new JPanel();
			buttonPane.setPreferredSize(new Dimension(640, 40));
			contentPanel.add(buttonPane, BorderLayout.SOUTH);
			{
				JButton addBtn = new JButton("회원추가");
				addBtn.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						AddMember adm = new AddMember(table);
						adm.setVisible(true);
						
					}
				});
				buttonPane.add(addBtn);
			}
			{
				JButton modBtn = new JButton("회원수정");
				modBtn.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						int r = table.getSelectedRow();
						
						// 회원번호는 0번째 열이니까
						if (r == -1) {
							JOptionPane.showMessageDialog(null, "수정할 줄을 누르세요");
							return;
						}
						String mno = table.getValueAt(r, 0).toString();
						if (r != -1) {
							// 수정할 대상을 선택했다면 회원정보 수정 패널을 생성
							// 단, UpdateMember의 생성자에 수정할 회원 번호를 매개변수로 전달
							// 또한 회원정보 수정 후 JTable의 model을 변경해야 하므로
							// 수정해야 할 행row과 JTable을 매개변수로 전달
							UpdateMember upm = new UpdateMember( mno, r, table );
							// 처음에는 이렇게 하면 오류가 나. 생성자로 넘겨줄 때 받을 녀석이
							// UpdateMember에 있기 때문이지. UpdateMember로 가서
							// 생성자 정의를 하면 돼.
							// 나머지는 upm dialog에서 고치면 되는 거지
							// upm dialog에서는 selectOneSql을 이용해서 바꿔주면 되는거야.
							upm.setVisible(true);
							// 패널을 화면에 표시
							// 회원번호가 1번인 회원의 정보를 전부 upm에 넘겨 줘야 되잖아
							// 생성자를 이용해서 넘기면 돼. getter/setter는 우편번호 할 때 해 봅시다.
						}
						
/*
						 * if (r == -1) {
							JOptionPane.showMessageDialog(null, "수정할 행을 선택하세요!");
							return;
						}
						String mno = table.getValueAt(r, 0).toString();
						if (mdao.updateMember(m) > 0) {
							JOptionPane.showMessageDialog(null, "성공적으로 수정됨!");
							model.removeRow(r);
							table.repaint();
						}
*/ // 여긴 내가 작성한 부분
					}
				});
				buttonPane.add(modBtn);
			}
			{
				JButton delBtn = new JButton("회원삭제");
				// 데이터베이스가 지워진 다음 스윙에 보이는 행이 지워 져야 데이터 무결성이 지켜 지지.
				delBtn.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						int r = table.getSelectedRow(); // 행
						// 행 선택을 하지 않을 때 생기는 오류를 잡기 위함. 다 만든 다음 쓰는거야.
							if (r == -1) {
								JOptionPane.showMessageDialog(null, "삭제할 행을 선택하세요!");
								return; // 더 이상 아래 코드를 실행하지 않음. 코드 실행 중단!
							}
						int choice = JOptionPane.showConfirmDialog(null, "정말 삭제 하시겠습니까?");
						if (choice == JOptionPane.OK_OPTION) {
								// 선택한 행의 위치를 알아냄
								// int c = table.getColumnCount(); // 열
								// 우리가 원하는 것은 회원 번호(0번째 열)이니까 열 정보는 불필요해
								String mno = table.getValueAt(r, 0).toString();
								// 선택한 행의 첫째 열 값을 알아냄
								// int값을 string으로 change. + ""; 를 써도 돼.
								// JOptionPane.showMessageDialog(null, mno); // test용
								if (mdao.deleteMember(mno) > 0) { // 삭제 성공 시
									JOptionPane.showMessageDialog(null, "성공적으로 삭제됨!");
									// 선택한 JTable의 행 삭제
									model.removeRow(r);
									// 삭제한 행을 JTable에 반영해서 다시 출력
									table.repaint();
								}
							}
						
					}
				});
				buttonPane.add(delBtn);
			}
		}
		{
			JPanel buttonPane = new JPanel();
			buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
			getContentPane().add(buttonPane, BorderLayout.SOUTH);
			{
				JButton okButton = new JButton("OK");
				okButton.setActionCommand("OK");
				buttonPane.add(okButton);
				getRootPane().setDefaultButton(okButton);
			}
			{
				JButton cancelButton = new JButton("Cancel");
				cancelButton.setActionCommand("Cancel");
				buttonPane.add(cancelButton);
			}
		}
	}

}
